'use strict';
const fs = require('fs');
const path = require('path');
var mkdirs = require('mkdirs');

const Service = require('egg').Service;

class UtilsService extends Service {

    /**
     * 图片路径处理
     * @param id
     * @returns {Promise<{id: *, name: *}>}
     */
   async imgUtil(file_path) {
        console.info('读取到的路径：',file_path);
        if(this.app.config.tempSwitch == 'on'){
            if(!this.app.lodash.isEmpty(file_path)){
                const file_path_0 = file_path.replace('eggimg720','eggimg0');//原图temp路径

                const new_path = file_path.replace('/'+this.app.config.tempname,'');//720图去除temp
                const new_path0 = new_path.replace('eggimg720','eggimg0');
                const file_dir = new_path.substring(0,new_path.indexOf('eggimg720') + 9);//去除720图路径的文件名，得到文件夹路径
                const file_dir_0 = file_dir.replace('eggimg720','eggimg0');//原图的转移路径文件夹
                if(!fs.existsSync(path.join(this.app.config.fileDir,file_dir))){//转移路径文件夹是否存在
                    mkdirs(path.join(this.app.config.fileDir,file_dir));
                }
                if(!fs.existsSync(path.join(this.app.config.fileDir,file_dir_0))){
                    mkdirs(path.join(this.app.config.fileDir,file_dir_0));
                }

                //同步rename 移动文件
                try{
                    fs.renameSync(path.join(this.app.config.fileDir,file_path),path.join(this.app.config.fileDir,new_path));
                    fs.renameSync(path.join(this.app.config.fileDir,file_path_0),path.join(this.app.config.fileDir,new_path0));
                }catch (e) {
                    //处理错误
                }


                //720图转移
                // const file = fs.readFileSync(path.join(this.app.config.fileDir,file_path));//读取文件到流
                // fs.writeFileSync(path.join(this.app.config.fileDir,new_path), file);//写入文件到指定位置
                // fs.unlinkSync(path.join(this.app.config.fileDir,file_path));//删除temp下此图片
                //原图转移
                // const file0 = fs.readFileSync(path.join(this.app.config.fileDir,file_path_0));//读取文件到流
                // fs.writeFileSync(path.join(this.app.config.fileDir,new_path0), file0);//写入文件到指定位置
                // fs.unlinkSync(path.join(this.app.config.fileDir,file_path_0));

                return new_path;//返回720图转移后路径
            }
            return file_path;
        }else{
            return file_path;
        }
    }

    /**
     * 富文本图片路径处理
     */
    async richUtil(content){
        if(this.app.config.tempSwitch == 'on'){
            var copy_content = content;//复制富文本
            var imgReg = /<img.*?(?:>|\/>)/gi; //正则提取img标签
            var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; //正则提取img的src
            var arr = content.match(imgReg);  // arr 为包含所有img标签的数组
            if(!this.app.lodash.isEmpty(arr)){
                arr.forEach((item,index,array)=>{ //遍历img数组，获取src
                    var src = item.match(srcReg);
                    //获取图片地址
                    const o_path = src[1];//带temp的图片路径
                    const o_path0 = o_path.replace('eggimg720','eggimg0');//原图temp路径
                    const file_path = path.join(this.app.config.fileDir,o_path);//加上盘符路径
                    const new_path = o_path.replace('/'+this.app.config.tempname,'');//720图去除temp
                    const new_path0 = new_path.replace('eggimg720','eggimg0');//原图移动路径
                    fs.renameSync(file_path,path.join(this.app.config.fileDir,new_path))
                    fs.renameSync(path.join(this.app.config.fileDir,o_path0),path.join(this.app.config.fileDir,new_path0))
                    copy_content = copy_content.replace(o_path,new_path);//修改富文本copy
                })
            }
            return copy_content;
        }else{
            return content;
        }

    }

    /**
     * 录音路径处理
     * @param id
     * @returns {Promise<{id: *, name: *}>}
     */
    async voiceUtil(file_path) {
        console.info('读取到的路径：',file_path);
        if(this.app.config.tempSwitch == 'on'){

            const new_path = file_path.replace('/'+this.app.config.tempname,'');//720图去除temp
            const file_dir = new_path.substring(0,new_path.indexOf('voice') + 5);//去除720图路径的文件名，得到文件夹路径
            if(!fs.existsSync(path.join(this.app.config.fileDir,file_dir))){//转移路径文件夹是否存在
                mkdirs(path.join(this.app.config.fileDir,file_dir));
            }

            //同步rename 移动文件
            try{
                let wav_path = await this.mp3towav(file_path,file_dir);
                wav_path = wav_path.path;
                // let res = await this.voice2text(wav_path);
                // console.info('处理后的打印结果：',res);
                // fs.renameSync(path.join(this.app.config.fileDir,file_path),path.join(this.app.config.fileDir,new_path));
                // fs.unlinkSync(path.join(this.app.config.fileDir,file_path));//删除temp下此图片
                return wav_path;//返回720图转移后路径
            }catch (e) {
                //处理错误
                console.info('转wav出错：',e)
                return file_path;
            }

        }else{
            return file_path;
        }
    }


    /**
     * mp3 转 wav
     * path mp3文件路径
     * file_dir wav存放路径
     * @returns {Promise<void>}
     */
    async mp3towav(file_path,file_dir){
        const {app,service,ctx} = this;
        // mp3 转wav
        let ffmpeg = require('fluent-ffmpeg');
        //绝对路劲
        var uploadedPath = this.app.config.fileDir + file_path;
        // console.info('转换前得MP3地址：',uploadedPath);
        let command = ffmpeg();
        //相对路劲
        let wav_path = file_dir + file_path.substring(file_path.indexOf('voice') + 5,file_path.indexOf('.mp3')) + ".wav";
        //绝对路劲
        let trans_path = this.app.config.fileDir + wav_path;
        // console.info('转换后的wav地址：',wav_path)
        // console.info('转换后的wav地址：',trans_path)
        return new Promise(function(resolve, reject) {
            command.input(uploadedPath)
                .saveToFile(trans_path)
                .on('error', function(err){
                    console.log(err);
                    resolve({
                        errno : '1',
                        msg : err
                    })
                })
                .on('end', function() {
                    console.log("success");
                    fs.unlinkSync(path.join(app.config.fileDir,file_path));//删除temp下此录音
                    resolve({
                        errno : '0',
                        msg : 'success',
                        path : wav_path
                    });
                });

        });
    }

    /**
     * 语音转文字
     * @param file_path
     * @returns {Promise<void>}
     */
    async voice2text(file_path){
        // console.info('即将转换的地址：',file_path)
        var APP_ID = this.app.config.baidu.APP_ID;
        var API_KEY = this.app.config.baidu.API_KEY;
        var SECRET_KEY = this.app.config.baidu.SECRET_KEY;
        var AipSpeechServer = require('baidu-aip-sdk').speech;
        // var fs = require('fs');
        var client = new AipSpeechServer(APP_ID, API_KEY, SECRET_KEY);
        var voice = fs.readFileSync(this.app.config.fileDir + file_path);
        var voiceBuffer = new Buffer(voice);
        // console.info('读取的文件：',voiceBuffer);
        return new Promise(function(resolve, reject) {
            client.recognize(voiceBuffer, 'wav', 16000).then(function (result) {
                // console.info('处理结果：', result);
                var data = [];
                if (result.err_no === 0) {
                    data = result.result;
                }
                var return_data = {
                    code: result.err_no,
                    data: data,
                    msg: result.err_msg
                };
                // return return_data;
                resolve(return_data);
            }, function (err) {
                // console.info('处理结果错误：', err);
                resolve({
                    code: '2001',
                    msg: err
                });
                // return {
                //     code: '300',
                //     msg: '转换出错'
                // }
            });
        });
    }

    /**
     * md5
     */
    async md5(str){
        const crypto = require('crypto');
        const hash = crypto.createHash('md5');
        // 可任意多次调用update():
        hash.update(str);
        return hash.digest('hex');
    }


}

module.exports = UtilsService;
